package com.xiaoma.pattern.proxy.jdk;

import com.xiaoma.pattern.proxy.jdk.person.*;
import com.xiaoma.pattern.proxy.jdk.strategy.impl.BuyInsuranceStrategy;
import com.xiaoma.pattern.proxy.jdk1.IDynamicProxyFactory;
import com.xiaoma.pattern.proxy.jdk1.IDynamicProxyFactoryImpl;
import org.junit.Test;

import java.io.IOException;

/**
 * https://blog.csdn.net/u010452388/article/details/80868392
 * 测试类
 *
 * @author maj
 * @date 2018年8月25日 上午9:30:43
 * <p>
 * JDK动态代理只能对实现了接口（注意必须有接口）的类生成代理，而不能针对类
 */
public class TestJDKProxy {

    @Test
    public void test() throws IOException {
        System.getProperties().put("jdk.proxy.ProxyGenerator.saveGeneratedFiles", "true");
        IDynamicProxyFactory dynamicProxyFactory = new IDynamicProxyFactoryImpl();

        /**
         * 1、创建一个目标对象
         * 2、创建一个事务
         * 3、创建一个拦截器
         * 4、动态产生一个代理对象
         */

        IPerson target = new PersonImpl3();

        IPerson target1 = new PersonImpl2();

        IPeople iPeople = new IPeopleImpl();
        //具体的增强策略
        Context context = new Context(new BuyInsuranceStrategy());

        MyInvocationhandler handler = new MyInvocationhandler();
//        ProxyFactory proxyFactory = new ProxyFactory(IPerson.class);
//        IPerson s=(IPerson)proxyFactory.newInstance(new MyProxy());
        //生成的代理对象，如 $Proxy0.jad
        handler.setTarget(target);
        handler.setContext(context);
        IPerson proxyInstance = handler.getProxyInstance();
        handler.setTarget(target1);
        IPerson person = handler.getProxyInstance();
        person.savePerson();

        //动态代理，可以代理不同类型的
        handler.setTarget(new UserImpl());
        handler.setContext(context);
        IUser user = handler.getProxyInstance();
        user.saveUser();

        /**
         * 参数一：设置代码使用的类加载器，一般采用跟目标类相同的类加载器
         * 参数二：设置代理类实现的接口，跟目标类使用相同的接口
         * 参数三：设置回调对象，当代理对象的方法被调用时，会调用该参数指定对象的invoke方法
         *
         */

    }
}
